/*************************************************************************
> File Name: longest_substring.cpp
> Author: icebear
> Mail: 3322366195@qq.com
> Created Time: 2023-07-31 11:43:36
> Description: 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
************************************************************************/

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    // 滑动窗口法
    int lengthOfLongestSubstring(string s)
    {
        int left = 0, right = 0;
        int res = 0;
        // map记录区间内每种字符的出现次数
        unordered_map<char, int> map;
        // 移动滑窗右边界
        for (; right < s.size(); right++)
        {
            map[s[right]]++;
            // 若不满足条件，移动left至恰好满足条件，这样才能实现最大滑动窗口
            while (map[s[right]] != 1)
            {
                map[s[left]]--; // 移除左字母的计数
                left++;         // 左边界往右移动
            }
            // 更新结果 看是之前的结果更大还是之后得劲结果更大
            res = max(res, right - left + 1);
        }
        return res;
    }
// 神秘方法
#if 1

    int _lengthOfLongestSubstring(string s)
    {
        unsigned char ch[256]{0}; // 相当于手动的hash表 下标是key 值是value;
        int res = 0, length = s.size();
        for (int right = 0, left = 0; right < length; right++)
        {
            ch[s[right]]++;
            while (ch[s[right]] == 2)
            {
                ch[s[left++]]--;
            }
            res = max(res, right - left + 1);
        }
        return res;
    }

#endif
};

int main(int argc, char const *argv[])
{
    string input = "abcabcbb";
    Solution s;
    printf("%d\n", s.lengthOfLongestSubstring(input));
    return 0;
}
